package com.xiaofeng.tools;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import org.apache.pdfbox.io.MemoryUsageSetting;
import org.apache.pdfbox.multipdf.PDFMergerUtility;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

public class PdfMerge {

    public static void main(String[] args) {
        //源文件的所有路径
        List<String> sourceFiles = new ArrayList<>();


        // pdf源文件夹
        String sourcePdfDir = "D://pdf";
        // 扫描文件夹下的文件
        File fileDir =  new File(sourcePdfDir);
        File[] files = fileDir.listFiles();
        for (File file : files){
            if (file.getName().endsWith(".pdf")){
                sourceFiles.add(file.getAbsolutePath());
            }
        }

        String targetFile = "D://"+ DateUtil.formatDate(new Date()) +"-merged.pdf";

        try {
            mergePdfFiles(sourceFiles, targetFile);
            System.out.println("PDF 文件合并成功！输出文件: " + targetFile);
        } catch (IOException e) {
            System.err.println("合并 PDF 文件时出错: " + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 合并多个 PDF 文件为一个文件
     *
     * @param sourceFiles 源 PDF 文件路径列表
     * @param targetFile  目标 PDF 文件路径
     * @throws IOException 如果读取或写入文件时发生错误
     */
    public static void mergePdfFiles(List<String> sourceFiles, String targetFile) throws IOException {
        if (sourceFiles == null || sourceFiles.isEmpty()) {
            throw new IllegalArgumentException("源文件列表不能为空");
        }

        PDFMergerUtility merger = new PDFMergerUtility();
        merger.setDestinationFileName(targetFile);

        // 添加所有源文件到合并工具
        for (String sourceFile : sourceFiles) {
            merger.addSource(sourceFile);
        }

        // 执行合并操作，使用内存设置避免大文件问题
        merger.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());
    }
}
